package com.whut.www.file_storage.activity;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.whut.www.file_storage.R;

import java.util.Map;

public class SharedPreferencesActivity extends AppCompatActivity {

    private EditText mEt_name;
    private EditText mEt_password;
    private SharedPreferences mSharedPreferences;
    private SharedPreferences.OnSharedPreferenceChangeListener mListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_shared_preferences);
        //初始化控件
        initView();
        createSharedPreferences();
    }

    /**
     * SharedPreferences文件存储在/data/data/<PackageName>/shared_prefs目录下:
     * 以Key-Value键值对的方式存储,如果键已经存在,值将被覆盖
     * <map>
     * <string name="date">19910610</string>
     * <string name="name">cc</string>
     * </map>
     */
    private void createSharedPreferences() {
        //获取SharedPreferences的3种方法
        //  1
        SharedPreferences preferences = getPreferences(MODE_WORLD_READABLE);
        //文件名:MainActivity.xml
        //  2
        mSharedPreferences = getSharedPreferences("login", MODE_PRIVATE);
        //文件名:share.xml
        //  3
        SharedPreferences defaultSharedPreferences = PreferenceManager
                .getDefaultSharedPreferences(this);
        //文件名:<PackageName>_preferences.xml         context.getPackageName() + "_preferences"
        //SharedPreference改变监听器
        /**
         * 多次调用,第一次添加数据时即调用
         * @param sharedPreferences
         * @param key   sharedPreferences中value值变化对应的key，几个value值变化对应调用几次
         */
        mListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                Toast.makeText(SharedPreferencesActivity.this, key, Toast.LENGTH_SHORT).show();
            }
        };
        //注册SharedPreference改变监听器
        mSharedPreferences.registerOnSharedPreferenceChangeListener(mListener);
        //取消监听
        //sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener);
    }

    private void initView() {
        mEt_name = (EditText) findViewById(R.id.et_name);
        mEt_password = (EditText) findViewById(R.id.et_password);
    }

    public void click(View view) {
        switch (view.getId()) {
            case R.id.btn_store:
                storeData();
                break;
            case R.id.btn_restore:
                restoreData();
                break;
        }

    }



    /**
     * 获取数据
     */
    private void restoreData() {
        String name = mSharedPreferences.getString("name", "");
        String password = mSharedPreferences.getString("password", "");
        //获取所有数据
        Map<String, ?> all = mSharedPreferences.getAll();
        for (Map.Entry<String, ?> entry : all.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
        }
        //SharedPreferences是否包含key
        boolean ket = mSharedPreferences.contains("ket");
        mEt_name.setText(name);
        mEt_password.setText(password);
    }

    /**
     * 存储数据
     */
    private void storeData() {
        String name = mEt_name.getText().toString();
        String password = mEt_password.getText().toString();
        mEt_password.setText("");
        mEt_name.setText("");
        //获取编辑器
        SharedPreferences.Editor editor = mSharedPreferences.edit();
        //清空
        //editor.clear();
        //移除
        //editor.remove("key");
        //通过editor.putString()编辑数据
        editor.putString("name", name);
        editor.putString("password", password);
        //通过editor.commit()提交数据
        boolean commited = editor.commit();
        Toast.makeText(this, commited ? "成功" : "失败", Toast.LENGTH_SHORT).show();
        //editor.apply();
        ////////////////////////////////////////////////////////////////////////////////////////////
        //1.apply没有返回值而commit返回boolean表明修改是否提交成功
        //2.apply是将修改数据原子提交到内存,而后异步真正提交到硬件磁盘,而commit是同步的提交到硬件磁盘,
        //  因此在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。
        //  而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
        //3.apply方法不会提示任何失败的提示.由于在一个进程中,sharedPreference是单实例,一般不会出现并发冲突,
        //  如果对提交的结果不关心的话,建议使用apply,当然需要确保提交成功且有后续操作的话,还是需要用commit的。
        ////////////////////////////////////////////////////////////////////////////////////////////
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mListener != null) {
            //取消注册
            mSharedPreferences.unregisterOnSharedPreferenceChangeListener(mListener);
        }
    }

}
